Sensor Fusion for Kinetis MCUs (ISSDK/KSDK version)
main_freertos_single_task.c File Reference
+ Include dependency graph for main_freertos_single_task.c:

Go to the source code of this file.

Macros

#define I2C_DRIVER   Driver_I2C1_KSDK2_Blocking
 

Functions

void myI2C_callback (uint32_t event)
 
static void read_task (void *pvParameters)
 
int main (void)
 

Variables

SensorFusionGlobals sfg
 
ControlSubsystem controlSubsystem
 
StatusSubsystem statusSubsystem
 
PhysicalSensor sensors [2]
 
EventGroupHandle_t event_group = NULL
 
uint8_t sUARTOutputBuffer [256]
 
ARM_DRIVER_I2C Driver_I2C1_KSDK2_Blocking
 
ARM_DRIVER_I2C * I2Cdrv = &I2C_DRIVER
 

Detailed Description

This file shows one recommended way to incorporate sensor fusion capabilities into a FreeRTOS project.

Definition in file main_freertos_single_task.c.

Macro Definition Documentation

#define I2C_DRIVER   Driver_I2C1_KSDK2_Blocking

Definition at line 79 of file main_freertos_single_task.c.

Referenced by main().

Function Documentation

int main ( void  )

This is a FreeRTOS (single task) implementation of the NXP sensor fusion demo build.

Definition at line 91 of file main_freertos_single_task.c.

92 {
93  BOARD_InitPins(); // defined in pin_mux.c, initializes pkg pins
94  BOARD_BootClockRUN(); // defined in clock_config.c, initializes clocks
95  BOARD_InitDebugConsole(); // defined in board.c, initializes the OpenSDA port
96 
97  I2Cdrv->Initialize(myI2C_callback); // Initialize the KSDK driver for the I2C port
98  CLOCK_EnableClock(I2C_PORT_CLKEN); // You must ewnable a port's clock before configuring it
99  PORT_SetPinMux(I2C_PORT, I2C_SDA_PIN, I2C_MUX); // Configure the SDA pin muxing
100  PORT_SetPinMux(I2C_PORT, I2C_SCL_PIN, I2C_MUX); // Configure the SCL pin muxing
101  CLOCK_EnableClock(I2C_CLKEN); // Enable the clock for the I2C module
102  I2C_DRIVER.Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST); // Configure the I2C bus speed
103 
104  initializeControlPort(&controlSubsystem); // configure pins and ports for the control sub-system
105  initializeStatusSubsystem(&statusSubsystem); // configure pins and ports for the status sub-system
106  initSensorFusionGlobals(&sfg, &statusSubsystem, &controlSubsystem); // Initialize sensor fusion structures
107  // "install" the sensors we will be using
110  sfg.initializeFusionEngine(&sfg); // This will initialize sensors and magnetic calibration
111 
112  event_group = xEventGroupCreate();
113  xTaskCreate(read_task, "READ_TASK", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
114  sfg.setStatus(&sfg, NORMAL); // If we got this far, let's set status state to NORMAL
115  /* Start scheduling. */
116  vTaskStartScheduler();
117  for (;;) ;
118 }
void initSensorFusionGlobals(SensorFusionGlobals *sfg, StatusSubsystem *pStatusSubsystem, ControlSubsystem *pControlSubsystem)
utility function to insert default values in the top level structure
Definition: sensor_fusion.c:68
ControlSubsystem controlSubsystem
used for serial communications
static void read_task(void *pvParameters)
#define F_ALL_SENSORS
int8_t FXOS8700_Read(PhysicalSensor *sensor, SensorFusionGlobals *sfg)
void initializeStatusSubsystem(StatusSubsystem *pStatus)
initializeStatusSubsystem() should be called once at startup to initialize the data structure and to ...
Definition: status.c:185
#define I2C_DRIVER
installSensor_t * installSensor
function for installing a new sensor into t
initializeFusionEngine_t * initializeFusionEngine
set sensor fusion structures to initial values
int8_t FXOS8700_Init(PhysicalSensor *sensor, SensorFusionGlobals *sfg)
SensorFusionGlobals sfg
This is the primary sensor fusion data structure.
int8_t FXAS21002_Read(PhysicalSensor *sensor, SensorFusionGlobals *sfg)
void myI2C_callback(uint32_t event)
Dummy callback function for the I2C driver.
int8_t initializeControlPort(ControlSubsystem *pComm)
Initialize the control subsystem and all related hardware.
Definition: control.c:182
ARM_DRIVER_I2C * I2Cdrv
KSDK handle for the I2C port defined in Driver_I2C_KSDK2.c.
EventGroupHandle_t event_group
PhysicalSensor sensors[2]
This implementation uses two physical sensors.
setStatus_t * setStatus
change status indicator immediately
int8_t FXAS21002_Init(PhysicalSensor *sensor, SensorFusionGlobals *sfg)
Operation is Nominal.
StatusSubsystem statusSubsystem
provides visual (usually LED) status indicator

+ Here is the call graph for this function:

void myI2C_callback ( uint32_t  event)

Dummy callback function for the I2C driver.

Definition at line 82 of file main_freertos_single_task.c.

Referenced by main().

83 {
84  // Only needs to be present
85 }

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void read_task ( void *  pvParameters)
static

Definition at line 120 of file main_freertos_single_task.c.

Referenced by main(), and myI2C_callback().

121 {
122  uint16_t i=0; // general counter variable
123  portTickType lastWakeTime;
124  const portTickType frequency = 10;
125  lastWakeTime = xTaskGetTickCount();
126  while (1)
127  {
128  vTaskDelayUntil(&lastWakeTime, frequency);
129  GPIO_TogglePinsOutput(GPIOB, 1U << 9U); // toggle GPIO pin to check freq - DEBUG ONLY
130 
131  sfg.readSensors(&sfg, 1); // Reads sensors, applies HAL and does averaging (if applicable)
132  sfg.runFusion(&sfg); // Run the actual fusion algorithms
133  sfg.applyPerturbation(&sfg); // apply debug perturbation (testing only)
134  sfg.loopcounter++; // The loop counter is used to "serialize" mag cal operations
135  i=i+1;
136  if (i>=4) { // Some status codes include a "blink" feature. This loop
137  i=0; // should cycle at least four times for that to operate correctly.
138  sfg.updateStatus(&sfg); // This is where pending status updates are made visible
139  }
140  sfg.queueStatus(&sfg, NORMAL); // assume NORMAL status for next pass through the loop
141  sfg.pControlSubsystem->stream(&sfg, sUARTOutputBuffer); // Send stream data to the Sensor Fusion Toolbox
142  }
143 }
int32_t loopcounter
counter incrementing each iteration of sensor fusion (typically 25Hz)
streamData_t * stream
function to create packets for serial stream
Definition: control.h:73
readSensors_t * readSensors
read all physical sensors
struct ControlSubsystem * pControlSubsystem
updateStatus_t * updateStatus
status=next status
SensorFusionGlobals sfg
This is the primary sensor fusion data structure.
runFusion_t * runFusion
run the fusion routines
setStatus_t * queueStatus
queue status change for next regular interval
uint8_t sUARTOutputBuffer[256]
main output buffer defined in control.c
Definition: control.c:59
applyPerturbation_t * applyPerturbation
apply step function for testing purposes
Operation is Nominal.

+ Here is the caller graph for this function:

Variable Documentation

ControlSubsystem controlSubsystem

used for serial communications

Definition at line 71 of file main_freertos_single_task.c.

ARM_DRIVER_I2C Driver_I2C1_KSDK2_Blocking

KSDK handle for the I2C port defined in Driver_I2C_KSDK2.

EventGroupHandle_t event_group = NULL

Definition at line 74 of file main_freertos_single_task.c.

Referenced by main().

ARM_DRIVER_I2C* I2Cdrv = &I2C_DRIVER

KSDK handle for the I2C port defined in Driver_I2C_KSDK2.c.

Definition at line 88 of file main_freertos_single_task.c.

Referenced by main().

PhysicalSensor sensors[2]

This implementation uses two physical sensors.

Definition at line 73 of file main_freertos_single_task.c.

This is the primary sensor fusion data structure.

Definition at line 70 of file main_freertos_single_task.c.

StatusSubsystem statusSubsystem

provides visual (usually LED) status indicator

Definition at line 72 of file main_freertos_single_task.c.

uint8_t sUARTOutputBuffer[256]

main output buffer defined in control.c

Definition at line 59 of file control.c.

Referenced by BlueRadios_Init(), fusion_task(), main(), and read_task().